/*Copyright (C) 2009 Careil Baptiste

This program is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.

You should have received a copy of the GNU Lesser General Public
License along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/

////////////////////////////////////////////////////////////
/// \file Mutex.h Ce fichier regroupe les fonctions
/// concernant les mutex.
////////////////////////////////////////////////////////////
#ifndef CSLP_MUTEX_HEADER
# define CSLP_MUTEX_HEADER

# ifdef WIN32
#  include <winbase.h>
typedef CRITICAL_SECTION CSLP_MUTEX;
# else /* WIN32 */
#  include <sys/types.h>
typedef pthread_mutex_t CSLP_MUTEX;
# endif /* !WIN32 */
# include "dll.h"

# define CSLP_MUTEX_NONE 0
# define CSLP_MUTEX_ALREADY_OWNED 1


////////////////////////////////////////////////////////////
/// Permet d'initialiser le mutex. Cette fonction doit être
/// appelée avant toutes les autres concernant les mutex.
///
/// \param mutex Le mutex à initialiser.
////////////////////////////////////////////////////////////
void DLL_IMPEXP CSLP_InitMutex(CSLP_MUTEX *mutex);

////////////////////////////////////////////////////////////
/// Permet de tenter le verrouillage d'un mutex. La fonction
/// laisse la main même si le mutex n'est pas verrouillé.
///
/// \param mutex Le mutex à verrouiller.
/// \return CSLP_MUTEX_NONE Si le mutex est verrouillé.
/// \return CSLP_MUTEX_ALREADY_OWNED Si le mutex est déjà
/// verrouillé par un autre thread.
////////////////////////////////////////////////////////////
int DLL_IMPEXP CSLP_TryToLockMutex(CSLP_MUTEX *mutex);

////////////////////////////////////////////////////////////
/// Permet le verrouillage d'un mutex. La fonction retourne
/// qu'une fois le mutex verrouillé.
///
/// \param mutex Le mutex à verrouiller.
////////////////////////////////////////////////////////////
void DLL_IMPEXP CSLP_WaitToLockMutex(CSLP_MUTEX *mutex);

////////////////////////////////////////////////////////////
/// Permet de déverrouiller un mutex.
///
/// \param mutex Le mutex à déverrouiller.
////////////////////////////////////////////////////////////
void DLL_IMPEXP CSLP_UnlockMutex(CSLP_MUTEX *mutex);

////////////////////////////////////////////////////////////
/// Permet de supprimer un mutex.
///
/// \param mutex Le mutex à supprimer.
/// \return CSLP_MUTEX_NONE Si le mutex a été détruit.
/// \return CSLP_MUTEX_ALREADY_OWNED Si le mutex est verrouillé
/// par un autre thread.
////////////////////////////////////////////////////////////
int DLL_IMPEXP CSLP_DeleteMutex(CSLP_MUTEX *mutex);

#endif /* !CSLP_MUTEX_HEADER */
